package com.xukehong.demo.algorithm;

import com.alibaba.fastjson.JSONObject;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * @Author: xkh
 * @Date: 2019/9/10 17:48
 * @Version 1.0
 */
public class algorithm {

    /**
     * 冒泡排序
     */
    @Test
    public void bubbleSorting() {
        int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
        //统计比较次数
        int count = 0;
        System.out.println(arr.length);
        for (int i = 0; i < arr.length - 1; i++) {
            //第二轮比较
            for (int j = 0; j < arr.length - 1 - i; j++) {
                //交换位置
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
                count++;
            }
        }
        System.out.println(Arrays.toString(arr));
        System.out.println(count);
    }

    /**
     * 第一个订单    待拼团  4比
     * 第二个订单    待拼团  3比
     * 第三个订单    待拼团  1比
     * 第四个订单    待拼团  1比
     * 第五个订单    待拼团  2比
     * ----------------------	 第一轮 5次
     * 第一次下单----   第一个订单第一笔
     * 第二次下单----   第二个订单第一笔
     * 第三次下单----   第三个订单第一笔
     * 第四次下单----   第四个订单第一笔
     * 第五次下单----   第五个订单第一笔
     * ----------------------  第二轮  3次
     * 第六次下单---- 数量6-5  则为第一个>=2比  第一个订单第二笔订单
     * 第七次下单---- 数量7-5  则为第二个>=2比  第二个订单第二笔订单
     * 第八次下单---- 数量8-5  则为第三个>=2比  第五个订单第二笔订单
     * ----------------------  第三轮  2次
     * 第九次下单 ----              则为第一个>=3笔  第一个订单第三笔订单
     * 第十次下单 ----              则为第二个>=3笔  第二个订单第三笔订单
     * ---------------------- 第四轮
     * 第十一次下单----             则为第一个>=4笔  第一个订单第四笔订单
     * <p>
     * 每次新的一轮返回上一轮最后的下单次数
     */
    @Test
    public void assemble() {
        //初始数据
        List<HashMap<String, Object>> list = assembleInitData();
        //上一轮最后的下单次数
        Integer lastOrderNo = 0;
        //第几轮
        Integer assembleRound = 1;
        //需要下单的笔数
        Integer preNumber = 12;
        //实际下单笔数
        Integer reNumber = 0;
        for (int i = 0; i < preNumber; i++) {
            System.out.print("第" + (i + 1) + "次下单----");
            JSONObject jsonObject = assembleStart(list, assembleRound, lastOrderNo, reNumber);
            if (jsonObject.getString("assembleRound") != null) {
                assembleRound = (Integer) jsonObject.remove("assembleRound");
                System.out.println("第" + assembleRound + "轮");
            }
            if (jsonObject.getString("lastOrderNo") != null) {
                lastOrderNo = (Integer) jsonObject.remove("lastOrderNo");
                System.out.println("上一轮最后的下单次数:" + lastOrderNo);
            }
            reNumber++;
        }


    }

    private JSONObject assembleStart(List<HashMap<String, Object>> list, Integer assembleRound, Integer lastOrderNo, Integer reNumber) {
        JSONObject jsonObject = new JSONObject();
        int number = (reNumber + 1) - lastOrderNo;
        int i = 0;
        int c = 0;
        for (int j = 0; j < list.size(); j++) {
            if ((Integer) list.get(j).get("number") >= assembleRound) {
                i++;
                if (number == i) {
                    for (int z = j + 1; z < list.size(); z++) {
                        if ((Integer) list.get(z).get("number") >= assembleRound) {
                            c++;
                        }
                    }
                    if (c == 0) {
                        jsonObject.put("assembleRound", assembleRound + 1);
                        jsonObject.put("lastOrderNo", reNumber + 1);
                    }
                    String groupOrderId = (String) list.get(j).get("groupOrderId");
                    System.out.println("     " + groupOrderId + " 第" + assembleRound + "笔");
                    break;
                }
            }
        }
        if (i == 0) {
            System.out.println("------正常商品匹配--------");
        }
        return jsonObject;
    }


    //初始数据
    public List<HashMap<String, Object>> assembleInitData() {
        List<HashMap<String, Object>> list = new ArrayList<>();
        //数据一
        HashMap<String, Object> hashMap1 = new HashMap();
        hashMap1.put("number", 4);
        hashMap1.put("groupOrderId", "第一个订单");
        list.add(hashMap1);

        //数据二
        HashMap<String, Object> hashMap2 = new HashMap();
        hashMap2.put("number", 3);
        hashMap2.put("groupOrderId", "第二个订单");
        list.add(hashMap2);

        //数据三
        HashMap<String, Object> hashMap3 = new HashMap();
        hashMap3.put("number", 1);
        hashMap3.put("groupOrderId", "第三个订单");
        list.add(hashMap3);

        //数据四
        HashMap<String, Object> hashMap4 = new HashMap();
        hashMap4.put("number", 1);
        hashMap4.put("groupOrderId", "第四个订单");
        list.add(hashMap4);

        //数据五
        HashMap<String, Object> hashMap5 = new HashMap();
        hashMap5.put("number", 2);
        hashMap5.put("groupOrderId", "第五个订单");
        list.add(hashMap5);
        return list;
    }
}
